数据结构与算法之数据结构 链表经典问题 合并有序链表 / 环形链表

数据结构与算法阿木 发布于 5 天前 1 次阅读


摘要:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本文将围绕链表这一主题,重点解析合并有序链表和环形链表两个经典问题,并给出相应的代码实现。

一、

链表是一种灵活的数据结构,广泛应用于各种场景。在处理链表问题时,我们需要熟练掌握链表的基本操作,如创建、插入、删除和遍历等。本文将针对合并有序链表和环形链表两个经典问题进行解析,并给出相应的代码实现。

二、合并有序链表

合并有序链表是指将两个有序链表合并成一个有序链表。假设有两个有序链表A和B,我们需要将它们合并成一个有序链表C。

1. 解题思路

(1)创建一个新链表C,初始化为空。

(2)比较A和B的头节点,将较小的节点添加到C中。

(3)将较小的节点的下一个节点与C的下一个节点相连。

(4)重复步骤(2)和(3),直到A或B的链表为空。

(5)将A或B的剩余部分添加到C的末尾。

2. 代码实现

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def merge_sorted_lists(l1, l2):


dummy = ListNode()


tail = dummy

while l1 and l2:


if l1.val < l2.val:


tail.next = l1


l1 = l1.next


else:


tail.next = l2


l2 = l2.next


tail = tail.next

tail.next = l1 if l1 else l2


return dummy.next


三、环形链表

环形链表是指链表中某个节点的下一个节点指向链表中的某个节点,形成一个环。判断一个链表是否为环形链表,以及找出环的入口节点是环形链表的两个经典问题。

1. 判断环形链表

(1)使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。

(2)如果快慢指针相遇,则链表为环形链表;否则,链表为非环形链表。

2. 找出环的入口节点

(1)使用快慢指针法,找到环的入口节点。

(2)将快指针移到链表头部,然后快慢指针同时移动,每次移动一步,当它们相遇时,相遇点即为环的入口节点。

3. 代码实现

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def has_cycle(head):


if not head or not head.next:


return False

slow = head


fast = head.next

while fast and fast.next:


if slow == fast:


return True


slow = slow.next


fast = fast.next.next

return False

def find_cycle_start(head):


if not head or not head.next:


return None

slow = head


fast = head.next

while fast and fast.next:


if slow == fast:


break


slow = slow.next


fast = fast.next.next

if not fast or not fast.next:


return None

fast = head


while slow != fast:


slow = slow.next


fast = fast.next

return slow


四、总结

本文针对链表这一主题,解析了合并有序链表和环形链表两个经典问题,并给出了相应的代码实现。通过学习这两个问题,我们可以加深对链表数据结构的理解,提高编程能力。在实际应用中,链表是一种非常实用的数据结构,希望本文能对大家有所帮助。