剑指offer 16、 合并两个排序的链表 python c++

题目描述:

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

思路:

新建一个链表做为最后结果,依次比较两个链表的值的大小,小的加到新链表。直到其中一个链表里面没元素了,然后把剩下的一个还有元素的链表插到新链表后面

c++版

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
        ListNode *res = new ListNode(0); //初始化一个0,不初始化下面保存起始节点可能报错
        ListNode *head;
        head = res;  //保存起始节点
        while(pHead1 && pHead2){  //两个都还有元素
            if(pHead1->val >= pHead2->val){
                res->next = pHead2;
                pHead2 = pHead2->next;
            }
            else{
                res->next = pHead1;
                pHead1 = pHead1->next;
            }
            res = res->next;
        }
        if(pHead1){   //如果剩下的还有元素的是链表1
            res->next = pHead1;
        }
        if(pHead2){   //如果剩下的还有元素的是链表2
            res->next = pHead2;
        }
        return head->next;  //返回head->next是因为head的值为0(我们初始化的那个)我们不要这个初始化的值
    }
};

python 版

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        res = ListNode(0)
        head = res
        while pHead1 and pHead2:
            if pHead1.val >= pHead2.val:
                res.next = pHead2
                pHead2 = pHead2.next
            else:
                res.next = pHead1
                pHead1 = pHead1.next
            res = res.next
        if pHead1:
            res.next = pHead1
        if pHead2:
            res.next = pHead2
        return head.next

还有一个笨办法, 最容易想到的,我把所有值取出来放数组里,从小到大排个序,然后利用这些值依次构造链表节点,串起来。

python版2

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        res = []
        #把两个链表的值全取出来放在列表里面
        while pHead1:
            res.append(pHead1.val)
            pHead1 = pHead1.next
        while pHead2:
            res.append(pHead2.val)
            pHead2 = pHead2.next
        res.sort()   #排个序
        dummy = ListNode(0)   #开始构造链表
        head = dummy  #保存初始节点
        for i in res:
            node = ListNode(i)  #利用列表里面的值构造节点
            dummy.next = node   #串接起来
            dummy = dummy.next
        return head.next  #返回head->next是因为head的值为0(我们初始化的那个)我们不要这个初始化的值
posted on 2021-06-10 17:30  雾恋过往  阅读(40)  评论(0编辑  收藏  举报

Live2D