List合集|2.21.138.92. 82.61.86.146.

2.Add Two Numbers

细节:最后一位l1和l2都是null的时候,如果carry是1,那还要再加一个1

如果有进位在本位上保留的不一定是0

dummy很好用 记得用

简洁写法:

while的条件里带carry

while条件里是 ||,里面再讨论l1、l2为null的情况

21. Merge Two Sorted Lists

不难 也有recursive的写法,但时间都是O(m+n)

138. Copy List with Random Pointer

一一对应关系,用hash,有点点绕,但还好

92. Reverse Linked List II

换来换去很复杂,但是只要抓住:设置好tail,每次操作都是把tail紧后面的node提到start紧后边就行。

记得设置dummy

82. Remove Duplicates from Sorted List II

while里套while,有无重复分别讨论start应不应该接下一个(还是start.next为跳过duplicate之后的)

61. Rotate List

这个题先算出来整体的size然后用k和整体的size算一算,用while定位node然后操作会比较方便。

比双指针更方便。

注意k%size才是真的k

注意while(size--)时,size会变。

86. Partition List

分成两个list,前面的list最后一个值接第二个list,注意后面的list最后一个值接NULL

146. LRU Cache

NODE基本功:

class Node{

public:

Node* next;

int val;

Node(int val_in):val(val_in), next(NULL){}

};

c.splice(pos , c2 , c2pos) 将 c2 内的 c2pos 所指元素转移到 c 内的 pos 所指位置( c 和 c2 可相同)
不抛出异常

不会上面这种快速方法的话下面这个也行:

 void moveToFirst(int key){
        dll.erase(ht[key].first);
        dll.push_front(key);
        ht[key].first=dll.begin();
    }

这道题的难点在于用什么container。需求:快速将中间的元素移到最前面:O(1)的insert和delete:list最好(ListNode)。但是get里同时需要快速查找key对应的val,所以再加一个map。

get :

给一个int(key),如果key本身不存在,那么直接返回-1.这个map可以做到。

如果key存在,需要两个动作:1. 将list里key的那个node移到最前面。2. 返回map里key对应的值。

而移到最前面这件事,要是想要快速,那么就需要这个key对应的list里node的地址。所以map里需要也有这个信息。

put:

给一对值,如果map里已经存在,更新值,且list放到前面。更新从map里就能做,放到前面则同样需要map里的地址信息。

如果不存在,构造一个新的listnode,放到前面。这里的重点在于,应该先放到前面,因为想要加入list只需要一个key就够。而map里的更新,val很简单,address直接list.begin()就行

如果size超了,popback。

你可能感兴趣的:(list,数据结构)