第 12 天
双指针 Two-pointer Tech 链表LinkList
这道题我想到了三种方法
第一种:两个指针分别指向两个链表头,在创建一个伪头节点head,比较两个指针节点的值,将小的加入伪节点链表后,直到一个指针走完,将另一个链表剩余部分加到伪节点链表后。
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None: return l2
if l2 is None: return l1
node1 = l1
node2 = l2
head = ListNode(None)
node = head
while node1 or node2:
if node1.val == node2.val:
node.next = ListNode(node1.val)
node.next.next = ListNode(node2.val)
node = node.next.next
if node1.next is None and node2.next is None:
break
elif node1.next is None and node2.next:
node.next = node2.next
break
elif node2.next is None and node1.next:
node.next = node1.next
break
else:
node1 = node1.next
node2 = node2.next
elif node1.val < node2.val:
node.next = ListNode(node1.val)
node = node.next
if node1.next:
node1 = node1.next
else:
node.next = node2
break
elif node1.val > node2.val:
node.next = ListNode(node2.val)
node = node.next
if node2.next:
node2 = node2.next
else:
node.next = node1
break
return head.next
第二种: 两个指针分别指向两个链表头,原地修改第一个链表,剩余和上一个方法一样。
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None:return l2
if l2 is None:return l1
head1,head2 = ListNode(None),ListNode(None)
head1.next = l1
head2.next = l2
node1 = head1
node2 = head2
while node1.next and node2.next:
if node1.next.val >= node2.next.val:
tem = node1.next
tem2 = ListNode(node2.next.val)
node1.next = tem2
node1.next.next = tem
node1 = node1.next
if node1.next is None:
node1.next = node2.next
break
node2 = node2.next
elif node1.next.val < node2.next.val:
node1 = node1.next
if node1.next is None:
node1.next = node2.next
break
return head1.next
方法三:不使用双指针,将全部节点值加入List排序后,根据List中的数组构建链表
leetcode 21题一样
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if list1==None and list2==None:
return None
list=[]
while True:
if list1:
list.append(list1.val)
list1=list1.next
if list2:
list.append(list2.val)
list2=list2.next
if list1==None and list2==None:
break
list.sort(reverse=True)
for i in range(len(list)):
if i == 0 :
print(list[i])
k=ListNode(list[i])
else:
k=ListNode(list[i],k)
return k
本题思路
求出两个链表的长度差值,让长的链表起始指针和短链表头部指针到链表尾部长度一致,两个指针同时开始向后搜索,发现一致节点则返回,否则没有交点。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if headA is None or headB is None:return None
node1 = headA
n = 0
node2 = headB
m = 0
while node1.next:
n += 1
node1 = node1.next
while node2.next:
m += 1
node2 = node2.next
node1 = headA
node2 = headB
if m>=n:
for _ in range(m-n):
node2 = node2.next
else:
for _ in range(n-m):
node1 = node1.next
while node1:
if node1 == node2:
return node1
else:
node1 = node1.next
node2 = node2.next