2022-2-14剑指offer day4
转战牛客网,
题1:
JZ25 合并两个排序的链表
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode list1,ListNode list2) { 12 ListNode dummy=new ListNode(0),head=dummy; 13 while (list1!=null&&list2!=null) { 14 if (list1.val<list2.val){ 15 dummy.next=new ListNode(list1.val); 16 dummy=dummy.next; 17 list1=list1.next; 18 }else { 19 dummy.next=new ListNode(list2.val); 20 dummy=dummy.next; 21 list2=list2.next; 22 } 23 } 24 if (list1!=null) dummy.next=list1; 25 if (list2!=null) dummy.next=list2; 26 return head.next; 27 } 28 }
思路:类似于双指针,每次挑选较小的节点,并前进指针,最后将没有遍历完的链表接在后面。
题2:
JZ52 两个链表的第一个公共结点
描述
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围: n \le 1000n≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:
可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。
输入描述:
输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。
返回值描述:
返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 12 ListNode p1=pHead1,p2=pHead2; 13 while (p1!=p2) { 14 p1=(p1==null)?pHead2:p1.next; 15 p2=(p2==null)?pHead1:p2.next; 16 } 17 return p1; 18 } 19 }
思路:两个指针同时遍历链表,当到null的时候换另外一条遍历,如果有交点必会相等,否则会在null处相等。
浙公网安备 33010602011771号