#数据结构与算法学习笔记#剑指Offer15:顺序链表合并+测试用例(Java、C/C++)

2018.8.12

发现很久很久之前刚刚开始学数据结构的时候就用C++写过这道题:#数据结构与算法学习笔记#PTA2:顺序链表合并(C/C++)

很简单依次比较两个链表当前结点的大小然后放进第三个链表里即可。


题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。


Java实现:

/**
 * 
 * @author ChopinXBP 
 * 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
 *  
 *
 */


public class ListMerge_16 {
	
	public static class ListNode {
		int val;
		ListNode next = null;

		ListNode(int val) {
			this.val = val;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ListNode head1 = new ListNode(0);
		ListNode head2 = new ListNode(1);
		ListNode p1 = head1;
		ListNode p2 = head2;
		for (int i = 1; i < 5; i++) {
			ListNode newnode1 = new ListNode(2 * i);
			ListNode newnode2 = new ListNode(2 * i + 1);
			p1.next = newnode1;
			p1 = p1.next;
			p2.next = newnode2;
			p2 = p2.next;
		}
		p1 = head1;
		System.out.print("原序列1: ");
		while(p1 != null) {
			System.out.print(p1.val);
			p1 = p1.next;
		}
		p2 = head2;
		System.out.print("\n原序列2: ");
		while(p2 != null) {
			System.out.print(p2.val);
			p2 = p2.next;
		}
		
		ListNode result = Solution(head1,head2);
		ListNode p3 = result;
		System.out.print("\n合并序列: ");
		while(p3 != null) {
			System.out.print(p3.val);
			p3 = p3.next;
		}
	}

	
	public static ListNode Solution(ListNode list1, ListNode list2){
		
		//if(list1 == null && list2 == null) return null;	//已经被以下两种情况包含
		if(list1 == null) return list2;
		if(list2 == null) return list1;
		
		
		ListNode result = new ListNode(0);
		ListNode head = result;
		ListNode p1 = list1;
		ListNode p2 = list2;
		if(p1.val <= p2.val){
			result.val = p1.val;
			p1 = p1.next;
		}		
		else{
			result.val = p2.val;
			p2 = p2.next;
		}
			
		
		while(p1 != null && p2 != null){
			if(p1.val <= p2.val){
				result.next = p1;
				p1 = p1.next;
			}else{
				result.next = p2;
				p2 = p2.next;
			}
			
			result = result.next;
		}
		
		
		if(p1 == null)
			result.next = p2;
		else if(p2 == null)
			result.next = p1;
				
		return head;
	}
	
}

C++实现示例:

见链接#数据结构与算法学习笔记#PTA2:顺序链表合并(C/C++)

或参考递归方法:

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
    if(pHead1 == NULL)
        return pHead2;
    else if(pHead2 == NULL)
        return pHead1;

    ListNode* pMergedHead = NULL;

    if(pHead1->m_nValue < pHead2->m_nValue)
    {
        pMergedHead = pHead1;
        pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
    }
    else
    {
        pMergedHead = pHead2;
        pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
    }

    return pMergedHead;
}

测试用例:

// ====================测试代码====================
ListNode* Test(char* testName, ListNode* pHead1, ListNode* pHead2)
{
    if(testName != NULL)
        printf("%s begins:\n", testName);

    printf("The first list is:\n");
    PrintList(pHead1);

    printf("The second list is:\n");
    PrintList(pHead2);

    printf("The merged list is:\n");
    ListNode* pMergedHead = Merge(pHead1, pHead2);
    PrintList(pMergedHead);
    
    printf("\n\n");

    return pMergedHead;
}

// list1: 1->3->5
// list2: 2->4->6
void Test1()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode6 = CreateListNode(6);

    ConnectListNodes(pNode2, pNode4);
    ConnectListNodes(pNode4, pNode6);

    ListNode* pMergedHead = Test("Test1", pNode1, pNode2);

    DestroyList(pMergedHead);
}

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

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pNode2 = CreateListNode(1);
    ListNode* pNode4 = CreateListNode(3);
    ListNode* pNode6 = CreateListNode(5);

    ConnectListNodes(pNode2, pNode4);
    ConnectListNodes(pNode4, pNode6);

    ListNode* pMergedHead = Test("Test2", pNode1, pNode2);

    DestroyList(pMergedHead);
}

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

    ListNode* pMergedHead = Test("Test3", pNode1, pNode2);

    DestroyList(pMergedHead);
}

// 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
void Test4()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pMergedHead = Test("Test4", pNode1, NULL);

    DestroyList(pMergedHead);
}

// 两个链表都为空链表
// list1: 空链表
// list2: 空链表
void Test5()
{
    ListNode* pMergedHead = Test("Test5", NULL, NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();

    return 0;
}

#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

猜你喜欢

转载自blog.csdn.net/qq_20304723/article/details/81608101