力扣面试150题--合并两个有序链表和随机链表的复制
Day 33
题目描述
思路
常规题目,比较list1和list2节点的值,取出较小值扩展链表,最后其中一个遍历完直接拼接另外一个即可(归并排序)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode res=new ListNode();//结果节点ListNode x=res;while(list1!=null&&list2!=null){//取出较小值拼接if(list1.val<=list2.val){x.next=list1;list1=list1.next;}else{x.next=list2;list2=list2.next;}x=x.next;}if(list1==null&&list2!=null){//直接拼接剩下的那个就行x.next=list2;}if(list2==null&&list1!=null){x.next=list1;}return res.next;}
}
题目描述
思路
中译中:创建一个新的链表,深拷贝即不能和原链表地址相同,将每个节点的next和random都拷贝下来,形成一个全新的链表。
思路:主要的难点在于,random是随机到任意的节点的,对于链表而言,这种随机跳跃很难实现,于是我采取了一个hashmap和list来将每个节点映射到list的序号中,先处理next的顺序,再使用map取出random的节点序号,直接从list中取出。
/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/class Solution {public Node copyRandomList(Node head) {Map<Node,Integer>map=new HashMap<>();List<Node> list=new ArrayList<>();int i=0;Node beg=head;while(beg!=null){//将每个节点序号映射到mapmap.put(beg,i);i++;beg=beg.next;}Node res=new Node(0);Node x=res;beg=head;while(beg!=null){//拷贝正常链表Node tes=new Node(beg.val);x.next=tes;x=x.next;beg=beg.next;list.add(tes);}beg=head;x=res.next;int num;while(beg!=null){//处理随机指针if(beg.random!=null){num=map.get(beg.random);x.random=list.get(num);}else{x.random=null;}beg=beg.next;x=x.next;}return res.next;}}