您的位置:首页 > 职场人生

P114、面试题17:合并两个排序的链表

2015-11-03 15:08 453 查看
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的。
struct ListNode{
int m_nKey;
ListNode* m_pNext;
}

测试用例:
1)功能测试(输入的两个链表有多个结点,结点的值互不相同或者存在值相等的多个结点);
2)特殊输入测试(两个链表的一个或者两个头结点为null指针、两个链表中只有一个结点)。

实现代码:

package com.yyq;

/**
* Created by Administrator on 2015/9/15.
*/
public class Merge {
public static ListNode merge(ListNode pHead1, ListNode pHead2){
if (pHead1 == null)
return pHead2;
else if(pHead2 == null)
return pHead1;
ListNode pMergedHead = null;
if (pHead1.getM_nValue() < pHead2.getM_nValue()){
pMergedHead = pHead1;
pMergedHead.setM_pNext(merge(pHead1.getM_pNext(), pHead2));
}
else{
pMergedHead = pHead2;
pMergedHead.setM_pNext(merge(pHead1,pHead2.getM_pNext()));
}
return pMergedHead;
}

public static void printList(ListNode pListHead) {
if (pListHead == null)
return;
ListNode pNode = pListHead;
while (pNode != null) {
System.out.print(pNode.getM_nValue() + "  ");
pNode = pNode.getM_pNext();
}
System.out.println();
}

// ====================测试代码====================
public static ListNode Test(String testName, ListNode pHead1, ListNode pHead2)
{
if(testName != null)
System.out.println(testName+" begins:");
System.out.println("The first list is:");
printList(pHead1);
System.out.println("The second list is:");
printList(pHead2);

System.out.println("The merged list is:");
ListNode pMergedHead = merge(pHead1, pHead2);
printList(pMergedHead);
return pMergedHead;
}

// list1: 1->3->5
// list2: 2->4->6
public static void Test1()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5);

ListNode pNode2 = new ListNode(2);
ListNode pNode4 = new ListNode(4);
ListNode pNode6 = new ListNode(6);
pNode2.setM_pNext(pNode4);
pNode4.setM_pNext(pNode6);

Test("Test1", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
}

// 两个链表中有重复的数字
// list1: 1->3->5
// list2: 1->3->5
public static void Test2()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5);

ListNode pNode2 = new ListNode(1);
ListNode pNode4 = new ListNode(3);
ListNode pNode6 = new ListNode(5);
pNode2.setM_pNext(pNode4);
pNode4.setM_pNext(pNode6);

Test("Test2", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
}

// 两个链表都只有一个数字
// list1: 1
// list2: 2
public static void Test3()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode2 = new ListNode(2);

Test("Test3", pNode1, pNode2);
pNode1 = null;
pNode2 = null;
}

// 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
public static void Test4()
{
ListNode pNode1 = new ListNode(1);
ListNode pNode3 = new ListNode(3);
ListNode pNode5 = new ListNode(5);
pNode1.setM_pNext(pNode3);
pNode3.setM_pNext(pNode5);
Test("Test4", pNode1, null);
pNode1 = null;
}

// 两个链表都为空链表
// list1: 空链表
// list2: 空链表
public static void Test5()
{
Test("Test5", null, null);
}

public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
}
}


输出结果:

Test1 begins:
The first list is:
1 3 5
The second list is:
2 4 6
The merged list is:
1 2 3 4 5 6
Test2 begins:
The first list is:
1 3 5
The second list is:
1 3 5
The merged list is:
1 1 3 3 5 5
Test3 begins:
The first list is:
1
The second list is:
2
The merged list is:
1 2
Test4 begins:
The first list is:
1 3 5
The second list is:
The merged list is:
1 3 5
Test5 begins:
The first list is:
The second list is:
The merged list is:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: