2022-2-14剑指offer day4

转战牛客网,

题1:

JZ25 合并两个排序的链表

描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
 
数据范围: 0 \le n \le 10000n1000,-1000 \le 节点值 \le 100010001000
要求:空间复杂度 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 1000n1000
要求:空间复杂度 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处相等。

posted on 2022-02-14 14:55  阿ming  阅读(29)  评论(0)    收藏  举报

导航