1. 程式人生 > >劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列

劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列

劍指offer程式設計題python實現(第16題)合併兩個排序的連結串列

題目描述
輸入兩個單調遞增的連結串列,
輸出兩個連結串列合成後的連結串列,
當然我們需要合成後的連結串列滿足單調不減規則。

'''題目描述
輸入兩個單調遞增的連結串列,
輸出兩個連結串列合成後的連結串列,
當然我們需要合成後的連結串列滿足單調不減規則。
'''

# -*- coding:utf-8 -*-
# 定義連結串列結點類
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    # 返回合併後列表頭
    def Merge(self, pHead1, pHead2):
        # 如果pHead1 為空連結串列
        if pHead1 is None:
            # 返回pHead2 
            return pHead2
        # 如果pHead2 為空連結串列
        if pHead2 is None:
            # 返回pHead1 
            return pHead1        
        #兩個連結串列都是遞增的,所以要判斷兩個連結串列的第一個元素的大小
        # 將首節點大的連結串列的的所有元素插入到首節點小的那個連結串列中
        # 第一個元素小的那個為最後要返回的合併後的連結串列
        if pHead1.val <= pHead2.val:
            # print('a',pHead1.val)
            pmerge = pHead1
        else:
            # print('b', pHead2.val)
            # pmerge = pHead2
            pHead1,pHead2 = pHead2,pHead1
            pmerge = pHead1       
        pre = None
        p1 = pHead1
        p2 = pHead2
        while p1 and p2:
            # 從頭開始判斷,兩個都不為空,才能進入迴圈
            if  p1.val <= p2.val:
                # 如果p2結點的值大於怕p1結點
                # p1指標向後移
                pre = p1
                p1 = p1.next                
            else:
                # p2所指的元素小於p1所指的元素,將p2插入到p1的前面
                cur = p2
                # p2向後移動一個結點
                p2 = p2.next
                cur.next=p1
                pre.next = cur
                pre = cur
        # 只要有一個連結串列到了末尾,都會跳出迴圈
        # 如果是因為p2到了末尾,說明p2上的所有結點都已經插入到p1上的合適位置
        if p2 is None:
            # 返回pmerge
            return pmerge
        # 如果p1到了末尾,p2還有結點,說明p2剩餘的結點都是大於等於p1
        # 尾結點的
        if p1 is None:
            # 將剩餘的p2接在p1的末尾即可
            pre.next = p2
            # 返回pmerge
            return pmerge
# 下面來測試程式
if __name__ == '__main__':
    sut = Solution()
    # 生成遞增的第一個連結串列
    phead1 = ListNode(3)
    p1 = phead1    
    for i in range(4,6):
        node = ListNode(i)
        phead1.next = node
        phead1 = phead1.next
    # 生成遞增的第二個連結串列
    phead2 = ListNode(2)
    p2 = phead2
    for j in range(4,11,2):
        node = ListNode(j)
        phead2.next = node
        phead2 = phead2.next
    # 呼叫
    MergeHead = sut.Merge(p1,p2)
    # 打印出返回的合併後的連結串列
    while MergeHead:
        print('merge',MergeHead.val)
        MergeHead = MergeHead.next