LeetCode专题-Python实现之第21题:Merge Two Sorted Lists

导航页-LeetCode专题-Python实现

相关代码已经上传到github:https://github.com/exploitht/leetcode-python
文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小写问题等等;更合理的代码实现参考我的github repo

1、读题

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

这道题说要合并提供的2个排好序的链接表,要求得到的新链表是2个旧链表的结点拼接得来。换言之该索引而不创建结点对象。

2、解题

有序总比无序要简单很多,既然2个链表都是有序的,那么每次都取2个链表的第一个元素中小的一个然后注意边界判断,就能解决问题了。具体逻辑参考代码及注释,代码如下:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        # 2个有序列表合并成1个列表
        # 如果l1为空,返回l2;如果l2为空,返回l1
        # 如果l1和l2都不为空,result_head取l1和l2中小的一个,小的一个指向自己的next
        # 如果有一个列表发现自己的下一个为空,也就是完成遍历,这时候将另外一个列表的next直接给result

        # 有一个链表为空则返回另外一个链表
        if l1 is None:
            return l2
        elif l2 is None:
            return l1

        # flag和head开始是同一个结点,flag引用会不断后移,head负责保留头结点索引
        result_flag = ListNode(0)
        result_head = result_flag
        while True:
            # 进入循环的时候2个链表都不为空
            # 保证l1指向的结点值小于l2指向的结点值
            (l1, l2) = (l1, l2) if l1.val < l2.val else (l2, l1)
            # 因为l1是小值,所以丢给前一个结点的next引用,flag索引后移
            result_flag.next = l1
            result_flag = result_flag.next
            # 因为每次取走的都是较小值开头的列表,所以要只能是这个列表先取完(小值还有不会操作大值)
            # 故只需要判断小值开头的l1的next是不是空就行
            if l1.next is None:
                # l1没有下一个元素了,这时候不管l2还有多少元素,直接丢给结果指针的next就行了
                result_flag.next = l2
                return result_head.next
            else:
                l1 = l1.next
posted @ 2017-10-12 16:53  胡说云原生  阅读(378)  评论(0编辑  收藏  举报